#ifndef PLAYCUBES_H
#define PLAYCUBES_H

using namespace std;

class playCubes{
public:
    playCubes(string& word,vector<string>& cubes){
        vector<vector<int> > graph;
        int cubesSize = cubes.size();
        graph.resize(word.size() + cubesSize + 2);
            for (int i = 0; i < graph.size(); i++){
                graph[i].resize(graph.size());
            }
            for (int j = 1; j <= cubesSize; j++){
                // проводим ребра от источника к каждому из кубиков
                graph[0][j] = 1;
                for (int i = 0; i < word.size(); ++i){
                    for (int k = 0; k < cubes[j-1].size(); ++k){
                        // из каждого кубика проводим ребро в букву входного слова,
                        // если эта буква на нем есть
                        if (cubes[j - 1][k] == word[i]){
                            graph[j][cubesSize + 1 + i] = 1;
                        }
                    }
                }
            }
            for (size_t i = 0; i < word.size(); ++i){
                    graph[cubesSize + 1 + i][graph.size() - 1] = 1;
            }

        // если кубиков меньше, чем длина слова, то бессмысленно продолжать
        if (cubes.size() < word.size()){
            cout << "NO" << endl;
            return;
        }
        fordFalkerson f(graph);
        int  streamSize = f.doFordFalkerson(0,word.size() + cubesSize + 1);
        //последний уровень перед стоком - наше слова
        //пропускная способность сети не больше длины слова
        //если совпадают,то слово составить можно
        if (streamSize == word.size()){
            cout << "YES" << endl;
            cout <<f.getCubes(cubes.size());
        }
        else{
            cout << "NO";
        }
    }
};
#endif // PLAYCUBES_H
